home *** CD-ROM | disk | FTP | other *** search
/ 9-Digit Zip Code Directory / 9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO / z4src.zip / BSCRC.C < prev    next >
C/C++ Source or Header  |  1995-08-04  |  8KB  |  211 lines

  1. //----------------------------------------------------------------------------
  2. //                            MODULE DESCRIPTION
  3. //
  4. //  Module:    bscrc.c
  5. //   Title:    Base library
  6. //  Notice:    John M. Weeder
  7. //                 Copyright (c) 1993. All rights reserved.
  8. //             This module contains proprietary information and should be 
  9. //                treated as confidential.
  10. //
  11. //----------------------------------------------------------------------------
  12. //                           MAINTENANCE HISTORY
  13. //
  14. // $Workfile$
  15. // $Revision$
  16. //   $Author$
  17. //     $Date$
  18. //      $Log$    
  19. //
  20. //----------------------------------------------------------------------------
  21. //                             MODULE NARRATIVE
  22. //
  23. //
  24. //    This module contains code to calculate 32 bit CRC codes..
  25. //
  26. //    The code in this module should be written entirely in C. 
  27. //    Do not use any C++ constructs.
  28. //
  29. //    This module is portable to:
  30. //        DOS 3.X+
  31. //        MS Windows 3.X+
  32. //        OS/2 2.X+
  33. //        OS/2 2.0 PM
  34. //        SCO UNIX.
  35. //
  36. //    The following compilers are supported:
  37. //        MSC 6.0A
  38. //        MSC/C++ 7.0
  39. //        Borland C++ 3.1 for DOS
  40. //        Borland C++ 1.0 for OS/2 2.X
  41. //        SCO UNIX cc
  42. //
  43. //----------------------------------------------------------------------------
  44. #include <bs.h>
  45.  
  46.  
  47. //----------------------------------------------------------------------------
  48. //    CRC Table
  49. //----------------------------------------------------------------------------
  50. static ULONG _FAR_ alCRCTable32[] =
  51.     {
  52.     0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
  53.     0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
  54.     0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
  55.     0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
  56.     0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
  57.     0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
  58.     0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
  59.     0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
  60.     0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
  61.     0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  62.     0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
  63.     0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
  64.     0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
  65.     0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
  66.     0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
  67.     0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
  68.     0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
  69.     0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
  70.     0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
  71.     0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  72.     0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
  73.     0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
  74.     0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
  75.     0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
  76.     0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
  77.     0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
  78.     0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
  79.     0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
  80.     0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
  81.     0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  82.     0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
  83.     0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
  84.     0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
  85.     0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
  86.     0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
  87.     0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
  88.     0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
  89.     0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
  90.     0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
  91.     0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  92.     0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
  93.     0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
  94.     0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
  95.     0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
  96.     0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
  97.     0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
  98.     0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
  99.     0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
  100.     0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
  101.     0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  102.     0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
  103.     0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
  104.     0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
  105.     0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
  106.     0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
  107.     0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
  108.     0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
  109.     0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
  110.     0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
  111.     0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  112.     0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
  113.     0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
  114.     0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
  115.     0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
  116.     };
  117.  
  118.  
  119. //----------------------------------------------------------------------------
  120. //   Description:    Compute 32 bit CRC for a block of data
  121. //    Parameters:    cp            Pointer to buffer
  122. //                        cb            Size of buffer.
  123. //       Returns:    CRC  code.
  124. //----------------------------------------------------------------------------
  125. CRC FN_E CrcCalc(PCBYTE pb, SIZET cb) 
  126. {
  127.     return CrcCalcAppend(pb, cb, (CRC)0);
  128. }
  129.  
  130.  
  131. //----------------------------------------------------------------------------
  132. //   Description:    Compute 32 bit CRC for a block of data, but append data
  133. //                          to the currently accumulated CRC.
  134. //    Parameters:    cp            Pointer to buffer
  135. //                        cb            Size of buffer.
  136. //                        crc        Current CRC. CRC should be zero on first pass.
  137. //       Returns:    CRC  code.
  138. //----------------------------------------------------------------------------
  139. CRC FN_E CrcCalcAppend(PCBYTE pb, SIZET cb, CRC crc)
  140. {
  141.     BYTE b;
  142.  
  143.     Assert(pb && cb > 0);
  144.     crc = ~crc;                                    // Invert crc
  145.     while (cb--)
  146.         {
  147.         b = *pb++;
  148.         crc = alCRCTable32[(SIZET)(((crc) ^ (b)) & 255)] ^ ((crc) >> 8);
  149.         }
  150.     return ~crc;
  151. }
  152.  
  153.  
  154. //----------------------------------------------------------------------------
  155. //   Description:    Calculate CRC for a file.
  156. //    Parameters:    pcsz            Name of source file.
  157. //                        pcrc            Variable to recieve CRC.
  158. //       Returns:    TRUE if successful.
  159. //----------------------------------------------------------------------------
  160. BOOL FN_E CrcFile(PCSZ pcsz, PCRC pcrc)
  161. {
  162.     CHAR szSrc[MAX_PATH];
  163.     FLAG16 fsSrc = FL_OPEN|FL_READWRITE|FL_DENYREADWRITE|FL_BINARY;
  164.     HF    hf;
  165.  
  166.     Assert(pcsz && pcrc);
  167.     strcpy(szSrc, pcsz);
  168.     FnameNormalize(szSrc, FNAME_DIR);
  169.     if (!FileOpen(&hf, szSrc, fsSrc, NULL))
  170.         return FALSE;
  171.     if (!FileCrc(hf, pcrc, (FPOS)-1, 0))
  172.         {
  173.         FileClose(hf);
  174.         return FALSE;
  175.         }
  176.     FileClose(hf);
  177.     return TRUE;
  178. }
  179.  
  180.  
  181. //----------------------------------------------------------------------------
  182. //   Description:    Compute 32 bit CRC for a string
  183. //    Parameters:    pcsz        String
  184. //       Returns:    CRC  code.
  185. //----------------------------------------------------------------------------
  186. CRC FN_E CrcCalcStr(PCSZ pcsz) 
  187. {
  188.     Assert(pcsz);
  189.     return CrcCalcAppend((PBYTE)pcsz, strlen(pcsz) + 1, (CRC)0);
  190. }
  191.  
  192.  
  193. //----------------------------------------------------------------------------
  194. //   Description:    Run standard test suite
  195. //    Parameters:    sTest        Test to run.
  196. //                                        0        Run all default tests (except).
  197. //       Returns:    TRUE if successful.
  198. //----------------------------------------------------------------------------
  199. #if COMPILE_TEST
  200. BOOL FN CrcTest(SHORT sTest)
  201. {
  202. static CHAR szTest[] = "ABCDEFG";
  203.     NOTUSED(sTest);
  204.     Output("String [%s], CRC = %08lX\n", szTest, CrcCalcStr(szTest));
  205.     return TRUE;
  206. }
  207. #endif
  208. //----------------------------------------------------------------------------
  209. //------------------------------- End of File --------------------------------
  210. //----------------------------------------------------------------------------
  211.